/**
 * 题意本质上就是给定N个1和M个2，两种操作：
 * 1. 等概率从N+M个中选择一个，减一；变为0的当然就不再考虑；
 * 2. 确定的将所有数都减一。
 * 两人轮流操作，不能操作的人负。问先手胜率。
 * 首先确定操作2不能随便做，因为一做就输。所以只能用操作1。
 * 令Dij为i个1、j个2的先手胜率，则
 *          i                           j
 * Dij = ------- * (1 - D[i-1][j]) + ------- * (1 - D[i+1][j-1])
 *        i + j                       i + j
 * 注意D的容量范围，1的数量最多可能到N+M。
 * 初始化可以是 D[i][0] = 1，对所有不为0的i。
 * 其实 D00 = 0 应该也可以
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;


using Real = long double;
using llt = long long;
using vi  =vector<int>;
using pii = pair<llt, int>;

llt const MOD = 1000000000 + 7;

llt qpow(llt a, llt n){
    llt r = 1;
    while(n){
        if(n & 1) r = r * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return r;
}

llt inv(llt a){return qpow(a, MOD - 2LL);}

int N;
vector<llt> A;
vector<vector<llt>> D;

llt dp(int n, int m){
    if(-1 != D[n][m]) return D[n][m];

    llt ans = 0;
    if(n > 0) ans = n * inv(n + m) % MOD * (1 - dp(n - 1, m)) % MOD;
    if(ans < 0) ans += MOD;

    ans = (ans + m * inv(n + m) % MOD * (1 - dp(n + 1, m - 1)) % MOD) % MOD;
    if(ans < 0) ans += MOD;
    // cout << "n = " << n << ", m = " << m << ": " << ans << "\n";
    return D[n][m] = ans;
}

llt proc(){
    int c[3] = {0};
    for(auto i : A) ++c[i];

    int n = c[1], m = c[2];
    if(0 == m) return 1;

    D.assign(2500, vector<llt>(m + 1, -1));
    for(int i=1;i<D.size();++i) D[i][0] = 1;

    return dp(n, m);        
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N;
        A.assign(N, {});
        for(auto & i : A) cin >> i;
        cout << proc() << "\n";
    }
    return 0;
}